package es.mfp.practicos.dao;

import java.util.List;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.googlecode.ehcache.annotations.Cacheable;
import com.googlecode.ehcache.annotations.TriggersRemove;
import com.googlecode.ehcache.annotations.When;

import es.mfp.practicos.domain.Empleado;
import es.mfp.practicos.domain.Estado;

@Repository
public class EmpleadoDAOImpl extends GenericDaoImpl<Empleado, Long> implements
		EmpleadoDAO {

	@SuppressWarnings("unchecked")
	@Cacheable(cacheName = "empleadosCache")
	@Override
	public List<Empleado> getAll() {
		List<Empleado> entities = null;

		String s = "SELECT c FROM " + Empleado.class.getSimpleName()
				+ " c ORDER BY c.apellido1 ASC, c.apellido2 ASC, c.nombre ASC ";
		entities = getJpaTemplate().find(s);

		return entities;
	}

	@TriggersRemove(cacheName = { "empleadosCache", "empleadosActivosCache",
			"fechasHastaCache", "fechasDesdeCache", "facturasActivasCache",
			"facturasCache" }, when = When.AFTER_METHOD_INVOCATION, removeAll = true)
	@Override
	@Transactional(readOnly = false)
	public void insert(Empleado t) {
		super.insert(t);
	}

	@SuppressWarnings("unchecked")
	@Cacheable(cacheName = "empleadosActivosCache")
	@Override
	public List<Empleado> findActivos() {
		List<Empleado> entities = null;

		String s = "SELECT c FROM "
				+ Empleado.class.getSimpleName()
				+ " c where c.estado = ?1 ORDER BY c.apellido1 ASC, c.apellido2 ASC, c.nombre ASC ";
		entities = getJpaTemplate().find(s, Estado.ACTIVO);

		return entities;
	}

	@TriggersRemove(cacheName = { "empleadosCache", "empleadosActivosCache",
			"fechasHastaCache", "fechasDesdeCache", "facturasActivasCache",
			"facturasCache" }, when = When.BEFORE_METHOD_INVOCATION, removeAll = true)
	@Transactional(readOnly = false)
	@Override
	public void update(Empleado object) {
		super.update(object);

	}

	@TriggersRemove(cacheName = { "empleadosCache", "empleadosActivosCache",
			"fechasHastaCache", "fechasDesdeCache", "facturasActivasCache",
			"facturasCache" }, when = When.AFTER_METHOD_INVOCATION, removeAll = true)
	@Override
	@Transactional(readOnly = false)
	public void delete(Long idEmpleado) {
		Empleado e = findByPK(idEmpleado);
		remove(e);
	}

	@SuppressWarnings("unchecked")
	@Override
	public Boolean existeNif(String nif, Long posibleiddelqueyaexiste) {
		List<Integer> res = null;
		String s = "SELECT count(nif) FROM " + Empleado.class.getSimpleName()
				+ " WHERE nif = ?1  ";

		if (posibleiddelqueyaexiste != null) {
			s += " and id <> ?2";
			res = getJpaTemplate().find(s, nif, posibleiddelqueyaexiste);
		} else {
			res = getJpaTemplate().find(s, nif);
		}

		return res.get(0).equals(Integer.valueOf(0));
	}

}
